package _17_InnerClass;
/**
 * 局部内部类等同于局部变量
 * 
 * 局部内部类中访问外部类的局部变量的时候,局部变量需要加 final 修饰(1.8之前),但是局部变量的值不能更改
 * 
 * 不管是成员方法还是静态方法,都不能使用 static 修饰内部类
 * 
 * 如果外部方法是成员方法的话,在内部类中可以直接访问外部类的所有属性
 * 
 * 如果外部方法是静态方法的话,在内部类中不能直接访问外部类的成员属性,需要创建对象访问
 * 
 * 不管方法是静态还是成员,局部内部类都不可以有静态声明
 * 
 * 类名 :
 * 		如果多个方法的内部类类名不一致,就是 外部类类名 $1 内部类类名
 * 		如果内部类类名一致,就是外部类类名 $1 内部类类名 ,外部类类名 $2 内部类类名 以此类推
 * 
 * 使用局部内部类,必须在方法内部调用
 * 
 * @author lenovo
 * @Date 2020年7月11日
 * @Time 下午8:27:03
 */
public class OuterClass_03 {
	private static String s1 = "成员变量";
	private String s2 = "成员变量";

	public void m1() {
		int i = 10;
		// 不能更改 i 的值,等于是 final 修饰
		// i = 2;
		class InnerClass {
			// 不能有静态声明
//			public static void m3() {}
			public void m4() {
				System.out.println(s1);
				System.out.println(s2);
				System.out.println(i);
			}
		}
		// 使用局部内部类,必须在方法内部调用
		InnerClass inner = new InnerClass();
		inner.m4();
		System.out.println(inner);
	}

	public static void m2() {
		int i = 10;
		// 不能更改 i 的值,等于是 final 修饰
		// i = 2 ;
		class InnerClass {
			// 不能有静态声明
//			public static void m3() {}
			public void m4() {
				System.out.println(s1);
				// 静态方法中的内部类,没有办法直接访问外部类的成员属性,需要用对象调用
//				System.out.println(s2);
				System.out.println(new OuterClass_03().s2);
				System.out.println(i);
			}
		}
		// 使用局部内部类,必须在方法内部调用
		InnerClass inner = new InnerClass();
		inner.m4();
		System.out.println(inner);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OuterClass_03 oc = new OuterClass_03();
		oc.m1();
		OuterClass_03.m2();
	}

}
